package main

// import (
// 	"context"
// 	"encoding/json"
// 	"fmt"
// 	"sync"
// 	"time"

// 	sarama "github.com/Shopify/sarama"
// )

// type consumerGroupHandler struct {
// 	name string
// }

// func (consumerGroupHandler) Setup(_ sarama.ConsumerGroupSession) error   { return nil }
// func (consumerGroupHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
// func (h consumerGroupHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {

// 	var c Ceph
// 	c.CephInit()
// 	var q TQuintet
// 	i := 0
// 	var TotalEndTime int64
// 	var TotalStartTime int64
// 	data := make([]byte, 4096)
// 	datat := make([]byte, 4096)
// 	for msg := range claim.Messages() {
// 		if msg.Value == nil {
// 			fmt.Println("nil msg")
// 		} else {
// 			if i == 0 {
// 				TotalStartTime = time.Now().UnixNano()
// 			}
// 			if 1 == 0 { //单线程
// 				json.Unmarshal(msg.Value, &q)
// 				fmt.Println("读取五元组 ", q.Quin[0].BlockId)
// 				for _, v := range q.Quin {
// 					if len(v.Trans) == 3 {
// 						data1 := c.getBlockData(string(v.Trans[0].Hash))
// 						data2 := c.getBlockData(string(v.Trans[1].Hash))
// 						data3 := c.getBlockData(string(v.Trans[2].Hash))
// 						Xor4K(data1, data2, datat)
// 						Xor4K(datat, data3, data)
// 						// if data[4095] != data1[4095]^data2[4095]^data3[4095] {
// 						// 	fmt.Println("error", v.BlockId, k)
// 						// } else {

// 						// }
// 					}
// 				}
// 				fmt.Println(q.Quin[0].BlockId, "冗余块计算完毕")
// 				sess.MarkMessage(msg, "")
// 				sess.Commit()
// 			}
// 			if 1 == 0 {
// 				go multiCeph(sess, msg, c)
// 			}
// 			if 1 == 1 { //单线程
// 				fmt.Println(msg.Offset)
// 				json.Unmarshal(msg.Value, &q)
// 				fmt.Println("读取五元组 ", q.Quin[0].BlockId)
// 				var wg sync.WaitGroup
// 				startTime := time.Now().UnixNano()
// 				for k, v := range q.Quin {
// 					wg.Add(1)
// 					go func(wg *sync.WaitGroup, k int, v Quintet) {
// 						defer wg.Done()
// 						if len(v.Trans) == 3 {
// 							data1 := c.getBlockData(string(v.Trans[0].Hash))
// 							data2 := c.getBlockData(string(v.Trans[1].Hash))
// 							data3 := c.getBlockData(string(v.Trans[2].Hash))
// 							Xor4K(data1, data2, datat)
// 							Xor4K(datat, data3, data)
// 						}
// 					}(&wg, k, v)

// 				}
// 				wg.Wait()
// 				endTime := time.Now().UnixNano()

// 				sess.MarkMessage(msg, "")
// 				sess.Commit()
// 				fmt.Println(msg.Offset, q.Quin[0].BlockId, "冗余块计算完毕,耗时", float64((endTime-startTime)/1e6))
// 				i++

// 			}
// 			if i == 60 {
// 				TotalEndTime = time.Now().UnixNano()
// 				fmt.Println("总计用时", float64((TotalEndTime-TotalStartTime)/1e6))
// 			}
// 		}
// 	}
// 	c.Free()
// 	return nil
// }

// func multiCeph(sess sarama.ConsumerGroupSession, msg *sarama.ConsumerMessage, c Ceph) {
// 	var q TQuintet
// 	// var data1 [1024*4]byte
// 	// var data2 [1024*4]byte
// 	// var data3 [1024*4]byte
// 	data := make([]byte, 4096)
// 	datat := make([]byte, 4096)
// 	json.Unmarshal(msg.Value, &q)
// 	fmt.Println("读取五元组 ", q.Quin[0].BlockId)
// 	for _, v := range q.Quin {
// 		if len(v.Trans) == 3 {
// 			data1 := c.getBlockData(string(v.Trans[0].Hash))
// 			data2 := c.getBlockData(string(v.Trans[1].Hash))
// 			data3 := c.getBlockData(string(v.Trans[2].Hash))
// 			Xor4K(data1, data2, datat)
// 			Xor4K(datat, data3, data)
// 		}
// 	}
// 	fmt.Println(q.Quin[0].BlockId, "冗余块计算完毕")
// 	sess.MarkMessage(msg, "")
// 	sess.Commit()
// }

// func DownloadMessage() {
// 	fmt.Println("consumer启动")

// 	config := sarama.NewConfig()
// 	config.Consumer.Return.Errors = false
// 	config.Version = sarama.V0_11_0_2
// 	config.Consumer.Offsets.AutoCommit.Enable = false
// 	config.Consumer.Offsets.Initial = sarama.OffsetNewest

// 	group, err := sarama.NewConsumerGroup([]string{KafkaIpAddress}, "t", config)
// 	//sarama.NewConsumerGroupFromClient()
// 	if err != nil {
// 		panic(err)
// 	}
// 	defer group.Close()

// 	for {
// 		handler := consumerGroupHandler{name: "sera"}
// 		err := group.Consume(context.Background(), []string{"block"}, handler)
// 		if err != nil {
// 			fmt.Println(err.Error())
// 		}
// 	}
// }
